package com.bjtu.ptsite.mapper;
import com.bjtu.ptsite.model.InviteCode;
import java.util.List;
import org.apache.ibatis.annotations.*;

/**
 *
 * @author Zehao Wang, Junjie Zhang, Yutao Wei
 *
 */
@Mapper
public interface InviteCodeMapper {

    /**
     * 根据邀请码查找对应的邀请码记录。
     *
     * @param code 邀请码字符串
     * @return 对应的 InviteCode 对象，如果未找到则返回 null
     */
    @Select("SELECT * FROM invite_code WHERE code = #{code}")
    InviteCode selectByCode(String code);

    /**
     * 减少指定邀请码的剩余使用次数。
     * 仅当邀请码存在且剩余使用次数大于0时执行减操作。
     *
     * @param code 邀请码字符串
     * @return 受影响的行数，1 表示成功减1，0 表示未进行减操作
     */
    @Update("UPDATE invite_code SET remaining_uses = remaining_uses - 1 " +
            "WHERE code = #{code} AND remaining_uses > 0")
    int decrementRemainingUses(String code);

    /**
     * 增加指定邀请码的最大使用次数和剩余使用次数。
     *
     * @param code 邀请码字符串
     * @return 受影响的行数，1 表示成功增加，0 表示未进行增加操作
     */
    @Update("UPDATE invite_code SET max_uses = max_uses + 1 , remaining_uses = remaining_uses + 1 " +
            "WHERE code = #{code}")
    int addCodeUses(String code);

    /**
     * 插入一个新的邀请码记录。
     *
     * @param inviteCode 包含邀请码相关信息的 InviteCode 对象
     *                   需要设置的属性包括：
     *                   - code (邀请码字符串)
     *                   - maxUses (最大使用次数)
     *                   - remainingUses (剩余使用次数)
     *                   - expiryTime (过期时间)
     *                   - createdBy (创建者用户ID)
     */
    @Insert("INSERT INTO invite_code(code, max_uses, remaining_uses, expiry_time, created_by) " +
            "VALUES(#{code}, #{maxUses}, #{remainingUses}, #{expiryTime}, #{createdBy})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertCode(InviteCode inviteCode);

    /**
     * 删除指定邀请码的记录。
     *
     * @param code 邀请码字符串
     * @return 如果删除成功返回 true，否则返回 false
     */
    @Delete("DELETE FROM invite_code WHERE code = #{code}")
    boolean deleteCode(String code);

    /**
     * 根据创建者用户ID获取所有相关的邀请码记录。
     *
     * @param userId 创建者用户ID
     * @return 包含所有相关 InviteCode 对象的列表，如果没有则返回空列表
     */
    @Select("Select * FROM invite_code WHERE created_by = #{userId}")
    List<InviteCode> getCodesById(int userId);
}
